package com.itheima.datastructure.demo1;

/**
 * Fib 类用于计算斐波那契数列
 */
public class Fib {
    // 定义最大允许的斐波那契索引，以避免整数溢出
    private static final int MAX_FIB_INDEX = 46;

    /**
     * 程序入口点
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        try {
            // 示例：计算并打印斐波那契数列的第10项
            System.out.println(calculateFibonacci(10));
        } catch (IllegalArgumentException | ArithmeticException e) {
            // 处理可能的异常，并打印错误信息
            System.out.println("Error: " + e.getMessage());
        }
    }

    /**
     * 计算斐波那契数列的第 num 项
     * @param num 非负整数，表示要计算的斐波那契数列的位置
     * @return 斐波那契数列的第 num 项
     * @throws IllegalArgumentException 如果 num 是负数或超出 int 类型范围
     */
    public static int calculateFibonacci(int num) {
        // 检查输入值是否为负数
        if (num < 0) {
            throw new IllegalArgumentException("num 不能为负数");
        }
        // 检查输入值是否超出最大允许的斐波那契索引
        if (num > MAX_FIB_INDEX) {
            throw new IllegalArgumentException("num 超出 int 类型范围");
        }

        // 处理斐波那契数列的前两个特殊项
        if (num <= 1) {
            return num;
        }

        // 初始化前两项
        int a = 0, b = 1, c;
        // 从第三项开始计算，直到第 num 项
        for (int i = 2; i <= num; i++) {
            // 计算当前项的值
            c = a + b;
            // 更新前两项的值
            a = b;
            b = c;
        }
        // 返回第 num 项的值
        return b;
    }
}
